home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / text / edit / tecoc-146.lha / exea.c < prev    next >
C/C++ Source or Header  |  1991-07-05  |  4KB  |  133 lines

  1. /*****************************************************************************
  2.  
  3.     ExeA()
  4.  
  5.     This function executes an A command.
  6.  
  7.     A    Appends the next page of the input file to the contents
  8.         of the text buffer, thus combining the two pages of
  9.         text on a single page with no intervening form feed
  10.         character.  This command takes no argument.  To perform
  11.         n Appends, use the n<A> construct.  Note that nA is a
  12.         completely different command.
  13.  
  14.     :A    Equivalent to the A command except that a value is
  15.         returned.  -1 is returned if the append succeeded, and
  16.         0 is returned if the append failed because the
  17.         end-of-the-input-file had previously been reached (^N
  18.         flag is -1 at start of this command).
  19.  
  20.     n:A    Appends n lines of text from the input file to the
  21.         contents of the text buffer.  The value of n must not
  22.         be negative.  A value is returned indicating whether or
  23.         not there were in fact n lines remaining in the input
  24.         file.  -1 is returned if the command succeeded.  0 is
  25.         returned if end-of-file on the input file was
  26.         encountered before all n lines were read in.  Note that
  27.         the command can succeed and yet read in fewer than n
  28.         lines in the case that the text buffer fills up.
  29.  
  30.     nA    Equivalent to the ASCII code for the .+n+1th character
  31.         in the buffer (that is, the character to the right of
  32.         buffer pointer position .+n). The expression -1A is
  33.         equivalent to the ASCII code of the character
  34.         immediately preceding the pointer and 0A is equivalent
  35.         to the ASCII code of the character immediately
  36.         following the pointer (the current character). If the
  37.         character position referenced lies outside the bounds
  38.         of the text buffer, this command returns a -1.
  39.  
  40. *****************************************************************************/
  41.  
  42. #include "zport.h"        /* define portability identifiers */
  43. #include "tecoc.h"        /* define general identifiers */
  44. #include "defext.h"        /* define external global variables */
  45. #include "deferr.h"        /* define identifiers for error messages */
  46.  
  47. DEFAULT ExeA()            /* execute an A command */
  48. {
  49.     BOOLEAN        EBfFul;
  50.     unsigned char    TmpChr;
  51.     BOOLEAN        ColonMod;
  52.  
  53.     DBGFEN(1,"ExeA",NULL);
  54.  
  55.     ColonMod = (CmdMod & COLON);        /* is it :A or n:A */
  56.     CmdMod &= ~COLON;                /* clear : flag */
  57.  
  58. /*
  59.  * if we have a numeric argument, it's nA or n:A
  60.  */
  61.  
  62.     if (EStTop > EStBot) {            /* if numeric argument */
  63.         UMinus();                /* if it's -A, make it -1A */
  64.     if (GetNmA() == FAILURE) {        /* get numeric argument */
  65.         DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
  66.         return FAILURE;
  67.     }
  68.  
  69.     if (ColonMod) {                /* if it's n:A */
  70.         if (NArgmt < 1) {
  71.             ErrMsg(ERR_IPA);
  72.         DBGFEX(1,DbgFNm,"FAILURE, n:A, n < 1");
  73.         return FAILURE;
  74.         }
  75.         while (NArgmt-- > 0) {
  76.             EBfFul = FALSE;
  77.         if (RdLine(&EBfFul) == FAILURE) {
  78.             DBGFEX(1,DbgFNm,"FAILURE, RdLine() failed");
  79.             return FAILURE;
  80.         }
  81.         if (EBfFul) {
  82.             break;
  83.         }
  84.         if (IsEofI[CurInp]) {        /* if end-of-file */
  85.             DBGFEX(1,DbgFNm,"PushEx(0)");
  86.             return PushEx(0L, OPERAND);
  87.         }
  88.         }
  89.         DBGFEX(1,DbgFNm,"PushEx(-1)");
  90.         return PushEx(-1L, OPERAND);
  91.     }
  92.  
  93. /*
  94.  * it's nA
  95.  */
  96.     if (NArgmt < 0) {
  97.         if ((GapBeg+NArgmt) < EBfBeg) {
  98.             DBGFEX(1,DbgFNm,"PushEx(-1)");
  99.         return PushEx(-1L, OPERAND);
  100.         }
  101.         TmpChr = *(GapBeg+NArgmt);
  102.     } else {
  103.         if ((GapEnd+NArgmt+1) > EBfEnd) {
  104.             DBGFEX(1,DbgFNm,"PushEx(-1)");
  105.         return PushEx(-1L, OPERAND);
  106.         }
  107.         TmpChr = *(GapEnd+NArgmt+1);
  108.     }
  109. #if DEBUGGING
  110.     sprintf(DbgSBf,"PushEx(%d)", TmpChr);
  111.     DbgFEx(1,DbgFNm,DbgSBf);
  112. #endif
  113.     return PushEx((LONG)TmpChr, OPERAND);
  114.     }
  115.  
  116. /*
  117.  * if there is no numeric argument, must be A or :A
  118.  */
  119.  
  120.     if (IsEofI[CurInp]) {            /* if already at end-of-file */
  121.         DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(0)" : "SUCCESS");
  122.     return ((ColonMod) ? PushEx(0L,OPERAND) : SUCCESS);
  123.     }
  124.  
  125.     if (RdPage() == FAILURE) {            /* read a page */
  126.         DBGFEX(1,DbgFNm,"FAILURE, RdPage() failed");
  127.     return FAILURE;
  128.     }
  129.  
  130.     DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(-1)" : "SUCCESS");
  131.     return (ColonMod) ? PushEx(-1L, OPERAND) : SUCCESS;
  132. }
  133.